#include "Thread.hpp"

#include <stdio.h>
#include <string.h>

namespace wd
{

Thread::Thread()
: _pthid(0)
, _isRunning(false)
{

}

void Thread::start()
{
    if(!_isRunning)
    {
        int ret = pthread_create(&_pthid , 
                                 nullptr , 
                                 start_routine , 
                                 this);
        if(ret != 0)
        {
            fprintf(stderr , "%s" , strerror(ret));

            return ;
        }

        _isRunning = true;
    }
}

// 这是一个静态的成员函数，没有 this 指针
// 无法直接获取到 Thread 的对象
// 应该通过线程入口函数的参数来传递
void * Thread::start_routine(void * arg)
{
    // 在线程入口函数内部必须要调用 run 方法
    // 它代表的是线程要执行的任务
    Thread * pthread = static_cast<Thread *> (arg);
    if(pthread)
    {
        // 基类指针调用纯虚函数
        pthread -> run();
    }
    return nullptr;
}

// 等待一个子线程运行结束
void Thread::join()
{
    if(_isRunning)
    {
        pthread_join(_pthid , nullptr);

        // 更改子线程状态
        _isRunning = false;
    }
}

} // end of namespace wd

